home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’96 / Talking Telnet / source / Speech / BuildSpeechMenu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-06-22  |  2.6 KB  |  136 lines  |  [TEXT/CWIE]

  1. #include    "speech.proto.h"
  2. #include    "menu_resrcdefs.h"
  3. #include    "rsdefs.h"
  4. #include    <Gestalt.h>
  5. #include    <Menus.h>
  6. #include    <Speech.h>
  7.  
  8.  
  9. Boolean            gCanSpeak = false;
  10. short            gNumberVoices = 0;
  11. short            gSelectedVoiceIndex = 0;
  12. short            gSpeakingVoiceIndex = 0;
  13. VoiceSpec **    gVoices = nil;
  14.  
  15.  
  16. Boolean BuildSpeechMenu(MenuHandle voicesMenu)
  17. {
  18.     OSErr    err = noErr;
  19.  
  20.     do {
  21.         long                speechAttr;
  22.         VoiceDescription    defaultVoiceInfo;
  23.         short                v;
  24.         
  25.         /* Is everything already set up? */
  26.         
  27.         if (gCanSpeak) {
  28.             break;
  29.         }
  30.         
  31.         /* Is there a menu to build on? */
  32.         
  33.         if (nil == voicesMenu) {
  34.             break;
  35.         }
  36.     
  37.         /* Is the Speech Manager present? */
  38.         
  39.         err = Gestalt(gestaltSpeechAttr, &speechAttr);
  40.         if (noErr != err || !((1L << gestaltSpeechMgrPresent) & speechAttr)) {
  41.             break;
  42.         }
  43.         
  44.         /* How many voices are there? */
  45.         
  46.         err = CountVoices(&gNumberVoices);
  47.         if (noErr != err || 0 >= gNumberVoices) {
  48.             break;
  49.         }
  50.         
  51.         /* get the VoiceSpec for the default voice */
  52.         
  53.         err = GetVoiceDescription(nil, &defaultVoiceInfo, sizeof(defaultVoiceInfo));
  54.         if (noErr != err) {
  55.             err = MakeVoiceSpec('\0\0\0\0', '\0\0\0\0', &defaultVoiceInfo.voice);
  56.         }
  57.         
  58.         /* Allocate space to store all the voices */
  59.  
  60.         if (nil != gVoices) {
  61.             DisposeHandle((Handle)gVoices);
  62.         }
  63.         gVoices = (VoiceSpec **)myNewHandle(gNumberVoices * sizeof(**gVoices));
  64.         if (nil == gVoices) {
  65.             err = MemError();
  66.             break;
  67.         }
  68.         
  69.         MoveHHi((Handle)gVoices);
  70.         HLock((Handle)gVoices);
  71.         
  72.         /* for every voice */
  73.         
  74.         for (v = 0; v < gNumberVoices; v++) {
  75.             VoiceDescription    info;
  76.             
  77.             /* get the VoiceSpec for the voice */
  78.             
  79.             err = GetIndVoice(v + 1, &(*gVoices)[v]);
  80.             if (noErr != err) {
  81.                 break;
  82.             }
  83.             
  84.             /* get the description (name, etc.) for the voice */
  85.             
  86.             err = GetVoiceDescription(&(*gVoices)[v], &info, sizeof(info));
  87.             if (noErr != err) {
  88.                 break;
  89.             }
  90.             
  91.             /* Add it to the menu */
  92.             
  93.             AppendMenu(voicesMenu, info.name);
  94.             
  95.             /* Is it the default voice? */
  96.             
  97.             if (EqualVoiceSpec(&(*gVoices)[v], &defaultVoiceInfo.voice)) {
  98.                 gSelectedVoiceIndex = v;
  99.             }
  100.         }
  101.         
  102.         gCanSpeak = v == gNumberVoices;
  103.         
  104.     } while (false);
  105.     
  106.     if (gCanSpeak) {
  107.         short    cmdChar = '\0';
  108.         
  109.         /* Unlock the gVoices array */
  110.         
  111.         HUnlock((Handle)gVoices);
  112.         
  113.         /* Get rid of Command H for send erase character */
  114.         
  115.         GetItemCmd(myMenus[Net], NEec, &cmdChar);
  116.         if ('H' == cmdChar) {
  117.             SetItemCmd(myMenus[Net], NEec, '\0');
  118.         }
  119.         
  120.         /* and set up the speech menu */
  121.         
  122.         gSpeakingVoiceIndex = gNumberVoices;
  123.         AdjustSpeechMenu(gSpeakSelectionEnabled);
  124.         
  125.     } else {
  126.         if (nil != gVoices) {
  127.             DisposeHandle((Handle)gVoices);
  128.             gVoices = nil;
  129.         }
  130.         DoSpeechError(err);
  131.     }
  132.     
  133.     return gCanSpeak;
  134.  
  135. }
  136.